Extract<U, G>
Uが、Gの部分型ならばGを返し、そうでなければneverを返す
ユースケースとしては両方の引数がunion型であるものが多い
定義
code:ts
type Extract<U, G> = U extends G ? U : never;
基本的に、UもGもunion型で用いられることが多い
引数の順序を入れ替えても全く同じ結果になる
例えば、
code:ts
type A1 = Extract<'X', 'X' | 'B' | 'C'>; // 'X'
type A2 = Extract<'X' | 'B' | 'C', 'X'>; // 'X'
code:ts
type A3 = Extract<'a' | 'b' | 'c' | 'd', 'a' | 'c' | 'f'>; // 'a' | 'c'
type A4 = Extract<'a' | 'c' | 'f', 'a' | 'b' | 'c' | 'd'>; // 'a' | 'c'
以下のことがわかる
共通のものを抜き出している
引数の順序を入れ替えても結果は同じ
両方の引数がUnion型出ない場合は、定義通り「部分型かどうかのチェックをする」と表現した方がわかりやすい
例
code:ts
type A5 = Extract<'X' | 'B', string>; // 'X' | 'B'
type A6 = Extract<string, 'X' | 'B'>; // never
code:ts
type A7 = Extract<number, string>; // never
type A8 = Extract<string, number>; // never
recordからも取れる
code:ts
type Drink =
| { category: "coffee"; origin: string }
| { category: "tea"; region: string; flavor: string };
type T1 = Extract<Drink, { category: "coffee" }>;
// ^? { category: "coffee"; origin: string }
応用例
Extract<U, G>の第1引数がRecordのUnionの時